package cn.qiku.rf.utils
{
	/**
	 * Contains reusable methods for operations pertaining 
	 * to int values.
	 */
	public class IntUtil
	{
		/**
		 * Rotates x left n bits
		 *
		 * @langversion ActionScript 3.0
		 * @playerversion Flash 9.0
		 * @tiptext
		 */
		public static function rol(x : int, n : int) : int
		{
			return ( x << n ) | ( x >>> ( 32 - n ) );
		}

		/**
		 * Rotates x right n bits
		 *
		 * @langversion ActionScript 3.0
		 * @playerversion Flash 9.0
		 * @tiptext
		 */
		public static function ror(x : int, n : int) : uint
		{
			var nn : int = 32 - n;
			return ( x << nn ) | ( x >>> ( 32 - nn ) );
		}

		/** String for quick lookup of a hex character based on index */
		private static var hexChars : String = "0123456789abcdef";

		/**
		 * Outputs the hex value of a int, allowing the developer to specify
		 * the endinaness in the process.  Hex output is lowercase.
		 *
		 * @param n The int value to output as hex
		 * @param bigEndian Flag to output the int as big or little endian
		 * @return A string of length 8 corresponding to the 
		 *		hex representation of n ( minus the leading "0x" )
		 * @langversion ActionScript 3.0
		 * @playerversion Flash 9.0
		 * @tiptext
		 */
		public static function toHex(n : int, bigEndian : Boolean = false) : String
		{
			var s : String = "";

			if ( bigEndian )
			{
				for ( var i : int = 0; i < 4; i++ )
				{
					s += hexChars.charAt(( n >> ( ( 3 - i ) * 8 + 4 ) ) & 0xF) + hexChars.charAt(( n >> ( ( 3 - i ) * 8 ) ) & 0xF);
				}
			}
			else
			{
				for ( var x : int = 0; x < 4; x++ )
				{
					s += hexChars.charAt(( n >> ( x * 8 + 4 ) ) & 0xF) + hexChars.charAt(( n >> ( x * 8 ) ) & 0xF);
				}
			}

			return s;
		}
	}
}